#ifndef SCREENCAPTURE_H
#define SCREENCAPTURE_H

#include <QObject>
#include <QScreen>
#include <QPixmap>
#include <QImage>
#include <QBuffer>
#include <QTimer>
#include <QMutex>
#include <QRect>
#include <QVector>
#include <QMap>
#include <QByteArray>
#include <QGuiApplication>

#include "../logging/logger.h"

// 屏幕区域结构体
struct ScreenRegion {
    QRect rect;            // 区域矩形
    QByteArray imageData;  // 区域图像数据
    int lastUpdated;       // 最后更新帧号
    
    ScreenRegion() : lastUpdated(0) {}
    
    ScreenRegion(const QRect &r) : rect(r), lastUpdated(0) {}
};

class ScreenCapture : public QObject
{
    Q_OBJECT

public:
    explicit ScreenCapture(QObject *parent = nullptr);
    ~ScreenCapture();
    
    // 启动屏幕捕获
    void start(int fps = 10);
    
    // 停止屏幕捕获
    void stop();
    
    // 捕获整个屏幕
    QByteArray captureFullScreen(int quality = 70);
    
    // 捕获指定区域
    QByteArray captureRegion(const QRect &region, int quality = 70);
    
    // 捕获变化的区域（差分编码）
    QVector<ScreenRegion> captureDirtyRegions(int quality = 70);
    
    // 设置压缩质量
    void setCompressionQuality(int quality);
    
    // 设置区域分割大小
    void setRegionSize(int width, int height);
    
    // 获取屏幕尺寸
    QSize getScreenSize() const;
    
    // 是否在捕获中
    bool isCapturing() const;
    
    // 设置是否启用差分编码
    void setDiffEncodingEnabled(bool enabled);
    
    // 是否启用差分编码
    bool isDiffEncodingEnabled() const;

signals:
    // 屏幕数据更新信号
    void screenUpdated(const QByteArray &imageData, const QSize &size);
    
    // 区域数据更新信号
    void regionUpdated(const QVector<ScreenRegion> &regions, const QSize &size);

private slots:
    // 定时捕获屏幕
    void onCaptureTimer();

private:
    QTimer *captureTimer;           // 捕获定时器
    QMutex captureMutex;            // 多线程保护互斥量
    QScreen *primaryScreen;         // 主屏幕
    QImage lastFrame;               // 上一帧图像
    QVector<ScreenRegion> regions;  // 屏幕分割区域
    int compressionQuality;         // 压缩质量
    int regionWidth;                // 区域宽度
    int regionHeight;               // 区域高度
    bool diffEncodingEnabled;       // 是否启用差分编码
    int frameCount;                 // 帧计数器
    
    // 初始化屏幕分割区域
    void initializeRegions();
    
    // 检测区域是否发生变化
    bool isRegionDirty(const QRect &region, const QImage &current, const QImage &previous);
    
    // 压缩图像数据
    QByteArray compressImage(const QImage &image, int quality = 70);
    
    // 区域发生变化的阈值
    static const int DIRTY_THRESHOLD = 5; // 百分比
};

#endif // SCREENCAPTURE_H 